/*
 * store_file_unittest.c
 *
 *  Created on: Feb 24, 2013
 *      Author: redchen
 */

#include <strings.h>
#include <stdio.h>
#include <string.h>
#include <unittest.h>
#include <stddefine.h>
#include <iterator_utils.h>
#include <emalloc.h>
#include <timer.h>

#include "store_file.h"

int test_store_file_setup(void)
{
    system("rm store_1");
    system("rm store_2");
    return 1;
}

int test_store_file_cleanup(void)
{
    system("rm store_1");
    system("rm store_2");
    return 1;
}

void test_store_file()
{
    StoreFile* file1 = store_file_create("store_1", "", STORE_FILE_NORMAL, 0);
    StoreFile* file2 = store_file_create("store_2", "", STORE_FILE_BLOCK, 1024 * 100);

    StoreFile* file3 = store_file_open("store_1");
    StoreFile* file4 = store_file_open("store_2");

    LEMON_TEST_EQUAL_STRING(store_file_get_file_name(file3), store_file_get_file_name(file1));
    LEMON_TEST_EQUAL_STRING(store_file_get_file_name(file4), store_file_get_file_name(file2));

    //write
    char data1[1024] = "123456789";
    store_file_wirte(file1, data1, strlen(data1) + 1);
    store_file_wirte(file2, data1, strlen(data1) + 1);

    char data2[1024] = "987654321";
    store_file_wirte(file1, data2, strlen(data2) + 1);
    store_file_wirte(file2, data2, strlen(data2) + 1);

    StoreFile* file5 = store_file_open("store_1");
    Vector* files1 = vector_new();
    store_file_read(file5, 0, timer_get_micro_second() + 1000 * 1000, files1);
    LEMON_TEST_EQUAL_INT(2, vector_size(files1));
    {
        BFile* f = vector_get(files1, 0);
        LEMON_TEST_EQUAL_STRING(data1, f->data);
    }
    {
        BFile* f = vector_get(files1, 1);
        LEMON_TEST_EQUAL_STRING(data2, f->data);
    }
    StoreFile* file6 = store_file_open("store_2");
    Vector* files2 = vector_new();
    store_file_read(file6, 0, timer_get_micro_second() + 1000 * 1000, files2);
    LEMON_TEST_EQUAL_INT(2, vector_size(files2));
    {
        BFile* f = vector_get(files2, 0);
        LEMON_TEST_EQUAL_STRING(data1, f->data);
    }
    {
        BFile* f = vector_get(files2, 1);
        LEMON_TEST_EQUAL_STRING(data2, f->data);
    }
}

void store_file_add_suite()
{
    UNITTEST_SUITE_INIT();
    UNITTEST_SUITE_SETUP(test_store_file_setup);
    UNITTEST_SUITE_CLEANUP(test_store_file_cleanup);
    UNITTEST_SUITE_ADD_TESTCASE("test_store_file", test_store_file);
}
